package com.ant.storage.wechat;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ant.storage.pojo.ReimburseDetail;
import lombok.Data;
import lombok.experimental.Accessors;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;


/**
 * @author hzd
 * @version 1.0
 * @date 2024/3/18 10:58
 */
@Data
@Accessors(chain = true)
public class Applyevent {
    /*
     *申请人userid
     */
    private String creator_userid;
    /*
     *模板id
     */
    private String template_id;
    /*
     *	审批人模式
     * 0-通过接口指定审批人、抄送人（此时approver、notifyer等参数可用）
     * 1-使用此模板在管理后台设置的审批流程(需要保证审批流程中没有“申请人自选”节点)，支持条件审批。
     * 默认为0
     */
    private Integer use_template_approver = 0;
    /*
     *提单者提单部门id，不填默认为主部门
     */
    private String choose_department;
    //审批流程信息，用于指定审批申请的审批流程，
    // 支持单人审批、多人会签、多人或签，可能有多个审批节点，
    // 仅use_template_approver为0时生效。
    // private List<Approver> approver;
    /*
     *抄送人节点userid列表，仅use_template_approver为0时生效。
     */
    //   private List<String> notifyer;

    /*
     *抄送方式：
     * 1-提单时抄送（默认值）；
     * 2-单据通过后抄送；
     * 3-提单和单据通过后抄送。仅use_template_approver为0时生效。
     */
    private Integer notify_type = 1;
    /*
     *审批申请数据，可定义审批申请中各个控件的值，
     *其中必填项必须有值，选填项可为空，
     *数据结构同“获取审批申请详情”接口返回值中同名参数“apply_data”
     */
    // private Applys apply_data;

    private JSONObject apply_data;
    /*
     *摘要信息，用于显示在审批通知卡片、审批列表的摘要信息，最多3行
     */
    //private List<Summary> summary_list;

    private JSONArray summary_list;

    private List<Approver> approver;
    // private JSONArray approver;

    private List<String> notifyer;

    public Applyevent() {
        this.use_template_approver = 0;
        this.apply_data = new JSONObject();
        // this.approver = new JSONArray();
        this.summary_list = new JSONArray();
    }

    public Applyevent(String creator_userid, String template_id) {
        this();
        this.creator_userid = creator_userid;
        this.template_id = template_id;
    }

    public void setNotifyer(List<String> notifyer) {
        this.notifyer = notifyer;
    }

    /**
     * 添加审批人
     * <p>
     * //  * @param attr   节点审批方式：1-或签；2-会签，仅在节点为多人审批时有效
     * 会签：指同一个审批节点设置多个人，如ABC三人，三人会同时收到审批，需全部同意之后，审批才可到下一审批节点；
     * 或签：指同一个审批节点设置多个人，如ABC三人，三人会同时收到审批，只要其中任意一人审批即可到下一审批节点；
     * //  * @param userId 审批节点审批人userid列表，若为多人会签、多人或签，需填写每个人的userid
     */
    //    public void addApprover(int attr, List<String> str) {
    //        JSONObject json = new JSONObject();
    //        json.put("attr", attr);
    //        json.put("userid",str);
    //        this.approver.add(json);
    //    }
    public void setApplyDataContents(JSONObject... contents) {
        // 审批申请详情，由多个表单控件及其内容组成，其中包含需要对控件赋值的信息
        this.apply_data.put("contents", contents);
    }


    /**
     * 摘要信息，用于显示在审批通知卡片、审批列表的摘要信息，最多3行
     *
     * @param text 摘要行显示文字，用于记录列表和消息通知的显示，不要超过20个字符
     */
    public void setSummaryInfo(String... text) {
        for (String s : text) {
            JSONArray summaryInfoArr = new JSONArray();
            JSONObject textObj = new JSONObject();
            textObj.put("text", s);
            textObj.put("lang", "zh_CN");
            summaryInfoArr.add(textObj);
            JSONObject summaryInfo = new JSONObject();
            summaryInfo.put("summary_info", summaryInfoArr);
            // 摘要信息，用于显示在审批通知卡片、审批列表的摘要信息，最多3行
            this.summary_list.add(summaryInfo);
        }
    }

    /**
     * 文本/多行文本控件（control参数为Text或Textarea）
     *
     * @param id   控件ID
     * @param text 文本内容，在此填写文本/多行文本控件的输入值
     */
    public JSONObject controlText(String id, String text) {
        JSONObject value = new JSONObject();
        if (text == null || text.equals("")) {
            return null;
        }
        value.put("text", text);
        return createControl(id, ControlType.text, value);
    }

    /**
     * 数字控件（control参数为Number）
     *
     * @param id         控件ID
     * @param new_number 数字内容，在此填写数字控件的输入值
     */
    public JSONObject controlNumber(String id, String new_number) {
        JSONObject value = new JSONObject();
        value.put("new_number", new_number);
        return createControl(id, ControlType.number, value);
    }

    /**
     * 金额控件（control参数为Money）
     *
     * @param id        控件ID
     * @param new_money 金额内容，在此填写金额控件的输入值
     */
    public JSONObject controlMoney(String id, String new_money) {
        if (new_money == null) {
            return null;
        }
        JSONObject value = new JSONObject();
        value.put("new_money", new_money);
        return createControl(id, ControlType.money, value);
    }

    /**
     * 日期/日期+时间控件（control参数为Date）
     *
     * @param id 控件ID
     *           //* @param 时间展示类型：day-日期；hour-日期+时间          ，和对应模板控件属性一致 type
     *           //* @param 时间戳-字符串类型，在此填写日期/日期+时间控件的选择值，以此为准 s_timestamp
     */
    public JSONObject controlDate(String id, String type, String s_timestamp) {
        if (s_timestamp == null) {
            return null;
        }
        //public JSONObject controlDate(String id, String data) {
        JSONObject value = new JSONObject();
        JSONObject date = new JSONObject();
        value.put("date", date);
        date.put("type", type);
        date.put("s_timestamp", s_timestamp);
        return createControl(id, ControlType.date, value);
    }

    public JSONObject controlSelectorMulti(String id, String type, String... key) {
        JSONObject value = new JSONObject();
        JSONObject selector = new JSONObject();
        JSONArray options = new JSONArray();
        selector.put("type", type);
        value.put("selector", selector);
        selector.put("options", options);

        for (String s : key) {
            JSONObject option = new JSONObject();
            option.put("key", s);
            options.add(option);
        }
        return createControl(id, ControlType.selector, value);
    }

    /**
     * 单选/多选控件（control参数为Selector）
     *
     * @param id   控件ID
     * @param type 选择方式：single-单选；multi-多选
     * @param key  选项key，可通过“获取审批模板详情”接口获得
     */
    public JSONObject controlSelector(String id, String type, String key) {
        if (key != null) {
            JSONObject value = new JSONObject();
            JSONObject selector = new JSONObject();
            JSONArray options = new JSONArray();
            selector.put("type", type);
            value.put("selector", selector);
            selector.put("options", options);
            JSONObject option = new JSONObject();
            option.put("key", key);
            options.add(option);
            return createControl(id, ControlType.selector, value);
        }
        return null;
    }


    /**
     * 成员控件（control参数为Contact，且value参数为members）
     *
     * @param id      控件ID
     * @param userIds 所选成员的userid
     * @param names   成员名
     */
    public JSONObject controlMembers(String id, List<String> userIds, List<String> names) {
        //{
        //    "members": [
        //        {
        //            "userid": "WuJunJie",
        //            "name": "Jackie"
        //        },
        //        {
        //            "userid": "WangXiaoMing"
        //            "name": "Tom"
        //        }
        //    ]
        //}
        if (names == null) {
            return null;
        }
        JSONObject value = new JSONObject();
        JSONArray members = new JSONArray();
        value.put("members", members);
        for (int i = 0; i < userIds.size(); i++) {
            JSONObject member = new JSONObject();
            member.put("userid", userIds.get(i));
            member.put("name", names.get(i));
            members.add(member);
        }

        return createControl(id, ControlType.contact, value);
    }

    /**
     * 部门控件（control参数为Contact，且value参数为departments）
     *
     * @param id        控件ID
     * @param openapiId 所选部门id
     * @param names     所选部门名
     */
    public JSONObject controlDepartments(String id, List<String> openapiId, List<String> names) {
        //{
        //    "departments": [
        //        {
        //            "openapi_id": "2",
        //            "name": "销售部",
        //        },
        //        {
        //            "openapi_id": "3",
        //            "name": "生产部",
        //        }
        //    ]
        //}
        if (names == null) {
            return null;
        }
        JSONObject value = new JSONObject();
        JSONArray members = new JSONArray();
        value.put("departments", members);
        for (int i = 0; i < openapiId.size(); i++) {
            JSONObject member = new JSONObject();
            member.put("openapi_id", openapiId.get(i));
            member.put("name", names.get(i));
            members.add(member);
        }

        return createControl(id, ControlType.contact, value);
    }

    /**
     * 附件控件（control参数为File，且value参数为files）
     *
     * @param id 控件ID
     *           //  * @param fileid 文件id，该id为临时素材上传接口返回的的media_id，注：提单后将作为单据内容转换为长期文件存储；
     *           目前一个审批申请单，全局仅支持上传6个附件，否则将失败。
     */
    public JSONObject controlFile(String id, List<String> list) {
        if (list == null || list.size() == 0) {
            return null;
        }
        JSONObject value = new JSONObject();
        JSONArray files = new JSONArray();
        if (list != null && list.size() > 0) {
            for (int i = 0; i < list.size(); i++) {
                if (i <= 5) {
                    JSONObject file = new JSONObject();
                    file.put("file_id", list.get(i));
                    files.add(file);
                }
            }
            value.put("files", files);
            return createControl(id, ControlType.file, value);
        }
        return null;

    }


    public JSONObject controlTable(String id, List<ReimburseDetail> lists) {

        if (lists == null || lists.size() == 0) {
            return null;
        }
        JSONObject value = new JSONObject();
        JSONArray options = new JSONArray();
        value.put("children", options);

        if (lists != null && lists.size() > 0) {
            for (int i = 0; i < lists.size(); i++) {
                JSONObject list = new JSONObject();
                JSONArray item = new JSONArray();
                list.put("list", item);
                JSONObject vas = new JSONObject();
                String amount = lists.get(i).getProjectAmount() == null || lists.get(i).getProjectAmount() == "" ? "1"
                        : lists.get(i).getProjectAmount();
                vas.put("text", lists.get(i).getProjectName());
                JSONObject control = createControl("Text-1710743750695", ControlType.text, vas);
                item.add(control);

                JSONObject bb = new JSONObject();
                bb.put("text", amount);
                JSONObject control2 = createControl("Text-1710743760725", ControlType.text, bb);
                item.add(control2);

                JSONObject cc = new JSONObject();
                cc.put("text", lists.get(i).getProjectPrice().toString());
                JSONObject control3 = createControl("Text-1710743772776", ControlType.text, cc);
                item.add(control3);

                BigDecimal unit_price = new BigDecimal(amount);
                BigDecimal total_price = lists.get(i).getProjectPrice().multiply(unit_price).setScale(2,
                        RoundingMode.HALF_UP);
                JSONObject dd = new JSONObject();
                dd.put("text", total_price.toString());
                JSONObject control4 = createControl("Text-1710743784573", ControlType.text, dd);
                item.add(control4);
                options.add(list);
            }
        }
        return createControl(id, ControlType.text, value);
    }

    public static JSONObject createControl(String id, String type, JSONObject value) {
        JSONObject control = new JSONObject();
        control.put("id", id);
        control.put("control", type);
        control.put("value", value);
        return control;
    }
}
